-module(mj_csmj).
-include("common.hrl").

-export([get_all/0,start/0,check_start_hu/1,check_hu/2,test_actions_self/2,test_actions_other/1,get_score/3]).

check_action(MyData,ActionData) ->
	mj_normal:check_action(MyData,ActionData).
  
get_all() ->
		[1011,1021,1031,1041,1051,1061,1071,1081,1091] ++
		[1012,1022,1032,1042,1052,1062,1072,1082,1092] ++
		[1013,1023,1033,1043,1053,1063,1073,1083,1093] ++
		[1014,1024,1034,1044,1054,1064,1074,1084,1094] ++
		[2011,2021,2031,2041,2051,2061,2071,2081,2091] ++
		[2012,2022,2032,2042,2052,2062,2072,2082,2092] ++
		[2013,2023,2033,2043,2053,2063,2073,2083,2093] ++
		[2014,2024,2034,2044,2054,2064,2074,2084,2094] ++
		[3011,3021,3031,3041,3051,3061,3071,3081,3091] ++
		[3012,3022,3032,3042,3052,3062,3072,3082,3092] ++
		[3013,3023,3033,3043,3053,3063,3073,3083,3093] ++
		[3014,3024,3034,3044,3054,3064,3074,3084,3094].

rand_list([],Ret) -> Ret;
rand_list(L,Ret) ->
	Rand = util:rand(1, erlang:length(L)),
	Item = lists:nth(Rand, L),
	rand_list(lists:sublist(L, Rand  - 1) ++ lists:sublist(L, Rand  + 1,erlang:length(L) - Rand),Ret ++ [Item]).
	
start() ->
	L = get_all(),
	RL = rand_list(L,[]),
	{ok,?GAME_TYPE_CSMAJIANG,lists:sublist(RL, 1, 14),lists:sublist(RL, 15, 13),lists:sublist(RL, 28, 13),lists:sublist(RL, 41, 13),lists:sublist(RL, 54, 55)}.

%%起手
%%大四喜：起完牌后，玩家手上已有四张一样的牌，即可胡牌。（四喜计分等同小胡自摸）
%%板板胡：起完牌后，玩家手上没有一张 2 、 5 、 8 （将牌），即可胡牌。（等同小胡自摸）
%%缺一色：起完牌后，玩家手上筒、索、万任缺一门，即可胡牌。（等同小胡自摸）
%%六六顺：起完牌后，玩家手上已有 2 个刻子（刻子：三个一样的牌），即可胡牌。（等同小胡自摸）
%%一只鸡：起完牌后，玩家手上只有一个“1索”，没有其他的“索子”即可胡牌。（等同小胡自摸）
%%一只花：起完牌后，玩家手上2 、 5 、 8 （将牌）里面只有一个五筒外，没有其他的将牌即可胡牌。（等同小胡自摸）
check_start_hu(L) ->
	SL = lists:sort(L),
	SNL = mj_normal:check_qp(SL,[]),
	case mj_normal:check_start_hu(dsx,SNL) of
		false ->
			case mj_normal:check_start_hu(lls,SNL) of
				false ->
					case mj_normal:check_start_hu(bbh,SNL) of
						false ->
							case mj_normal:check_start_hu(qys,SNL) of
								false ->
									case mj_normal:check_start_hu(yzj,SNL) of
										false -> 
											case mj_normal:check_start_hu(yzh,SNL) of
												false -> false;
												_ -> yzh
											end;
										_ -> yzj
									end;
								_ -> qys
							end;
						_ -> bbh
					end;
				_ -> lls
			end;
		_ -> dsx
	end.



%%天胡：单指庄家。庄家起牌后，即已经胡牌。
%%地胡：指闲家。当庄家打出第一张牌时，给闲家点炮。
%%碰碰胡：乱将，即表示任意数字的牌张都可以做将，可以是二五八数目牌做将，也可以是一三四六七九数目牌做将，以下乱将皆为此意。可碰，可杠，可自摸。
%%将将胡：玩家手上每一张牌都为 2 、 5 、 8 ，可碰。
%%清一色：乱将，有筒、索、万三种。任意一种胡牌规则皆可，可吃可碰，如果胡牌规则为大胡，则在原有大胡基础上再翻一倍。
%%海底捞月：最后一张牌为海底。海底胡牌，为大胡，需要将（将的种类根据当前牌型决定）。说明：长沙麻将中，海底牌可漫游。即轮到第一个玩家摸，他不要，则按照次序第二个玩家可要，依此类推。
%%海底炮：如果甲玩家要了海底，而又不能胡牌；乙玩家没有要得到海底，而又可以胡这张海底牌，即为乙玩家胡牌。同样如果丙和丁能胡则通胡。
%%七小对：胡牌时，手上任意七对牌。
%%豪华七小对： 胡牌时，手中任意五对牌，以及有四张一样的牌。
%%杠上开花：玩家有四张一样的牌，即可选择开杠掷骰子（听牌的情况下）。补张牌的计数方法为：从最后一张牌计算，倒数，骰子开几点，即取倒数第几叠牌的最上面一张（如最上一张没有则取下方一张）。一旦补张的牌能被开杠者胡则算大胡。
%%抢杠胡：暗杠不能抢杠胡， 只有明杠可以抢胡。玩家在明杠的时候，其他玩家可以胡被杠的此张牌，叫抢杠胡；
%%杠上炮：如果开杠者掷骰子补张，补张的牌开杠者若不能胡而其他玩家可以胡属于杠上炮，若胡，则属于杠上开花。
%%全求人：吃、碰、补张以及杠后只剩一张（熟称单调）由别人打出或者自己摸到相同牌张即可胡牌。
check_hu(L,Fields) ->
	SL = lists:sort(L),
	SNL =  mj_normal:check_qp(SL,[]),
	HSort = case mj_normal:check_hu(jjh, SNL, Fields) of
				false -> 
					case mj_normal:check_hu(pph, SNL, Fields) of
						false -> 
							case mj_normal:check_hu(qxd, SNL, Fields) of
								false -> 
									case mj_normal:check_hu(normal, SNL, Fields) of
										false -> false;
										_ -> normal									
									end;
								_ -> qxd
							end;
						_ -> pph
					end;
				_ -> jjh
			end,
	case HSort of
		false -> false;
		_ ->
			case mj_normal:check_qys(L, Fields) of
				true -> {ok,HSort,true};
				_ -> {ok,HSort,false}
			end
	end.

test_actions_self(MyData = {_Index,Qps,Fields},CanHU) ->
	AGPS1 = mj_normal:get_agangs_peng(MyData),
	AGPS = [#pt_public_action_data{action = ?ACTION_GAME_GANG,action_data1 = Qpa,del_field = Field} || {Qpa,Field} <-AGPS1],
	AGPQ1 = mj_normal:get_agangs_qp(MyData),
	AGPQ = [#pt_public_action_data{action = ?ACTION_GAME_GANG,action_data1 = Qp1,action_data2 = Qp2,action_data3 = Qp3,action_data4 = Qp4} || {Qp1,Qp2,Qp3,Qp4} <-AGPQ1],
	HU = case CanHU of
			 true ->
				 case check_hu(Qps,Fields) of
					 {ok,_,_} -> [#pt_public_action_data{action = ?ACTION_GAME_HU}];
					 _ -> []
				 end;
			 _ -> []
		 end,
	AGPS ++ AGPQ ++ HU ++ [#pt_public_action_data{action = ?ACTION_GAME_OUT}].

test_actions_other(MyData = {_Index,Qps,Fields}) ->
	#room_last{last_qp = LastQp} = get(room_last),
	Actions = [{?ACTION_GAME_PENG,LastQp},{?ACTION_GAME_GANG,LastQp},
			   {?ACTION_GAME_CHI,(LastQp div 10) - 2,(LastQp div 10) - 1},{?ACTION_GAME_CHI,(LastQp div 10) - 1,(LastQp div 10) + 1},
			   {?ACTION_GAME_CHI,(LastQp div 10) + 1,(LastQp div 10) + 2}],
	HU = case check_hu(Qps ++ [LastQp],Fields) of
			 {ok,_,_} -> [#pt_public_action_data{action = ?ACTION_GAME_HU,action_data1 = LastQp}];
			 _ -> []
		 end,
	test_actions(Actions,MyData,[]) ++ HU ++ [#pt_public_action_data{action = ?ACTION_GAME_GUO}].
	
test_actions([],_MyData,Ret)-> Ret;
test_actions([Action | NextActions],MyData,Ret)-> 
	case check_action(MyData, Action) of
		{ok,ActionData,_NextQp} ->
			test_actions(NextActions,MyData,Ret ++ [ActionData]);
		_ -> test_actions(NextActions,MyData,Ret)
	end.

get_score(_HSort,_AferHSort,true) -> 20;
get_score(_HSort,_AferHSort,_) -> 10.




	


	
	
